-- myMain.lua - 主流程调度脚本
-- 功能说明：主控制脚本，负责接收中控指令并调度不同的执行模式
-- 支持的执行模式：
--   1. wild - 野外挂机模式
--   2. daily_task - 日程安排模式 (注意：不是每日任务)
--   3. daily_mission - 每日任务模式 (注意：不是日程安排)
-- 命名约定：dailyTask = 日程安排, dailyMission = 每日任务
-- 负责主循环和主流程调度
local config = require('Config/config')
local Tools = require('Tools')
require('Config/TextRecognition1')
require('mybot')
require('Config/config_loader')

-- 定义文字识别库
local text_recognition_lib = require('Config.TextRecognition1').文字识别库

-- 加载游戏信息收集器
local gameInfoCollector = require('gameInfoCollector')

-- 加载WebSocket客户端
local websocket_client = require('Network/websocket_client')

-- 加载简化的设备数据发送器
local simple_sender = require('simple_device_data_sender')

-- 初始化用户配置
local config_loader = require('Config/config_loader')
if not config_loader.init() then
    print("[ERROR] 用户配置初始化失败，使用默认配置")
end

-- 初始化游戏信息收集器
print("[INFO] 初始化游戏信息收集器...")
if gameInfoCollector.init() then
    print("[INFO] 游戏信息收集器初始化成功")
else
    print("[WARNING] 游戏信息收集器初始化失败")
end

-- 初始化WebSocket连接
print("[INFO] 初始化WebSocket连接...")
if websocket_client.connect() then
    print("[INFO] WebSocket连接初始化成功")
else
    print("[WARNING] WebSocket连接初始化失败")
end

-- 插件消息处理函数
function onMessage(what, arg)
    print("[DEBUG] 收到插件事件: what=" .. tostring(what) .. ", arg=" .. tostring(arg))
    
    if what == 0 then
        -- 插件转发给脚本的WebSocket消息
        print("[DEBUG] 转发WebSocket消息给websocket_client处理")
        websocket_client.handle_plugin_message(arg)
    elseif what == 1 then
        -- 配置文件更新事件
        print("[INFO] 收到配置文件更新事件")
        -- 重新加载配置
        if config_loader then
            config_loader.reload_config()
        end
    elseif what == 2 then
        -- 控制指令事件
        print("[INFO] 收到控制指令: " .. tostring(arg))
        -- 处理控制指令
        handle_control_command(arg)
    else
        print("[DEBUG] 未知插件事件类型: " .. tostring(what))
    end
end

-- 设置插件事件监听器
setPluginEventCallBack(onMessage)
print("[INFO] 设置插件事件监听器")
print("[INFO] 启动设备数据发送协程")
simple_sender.start()
print("[INFO] 更新设备数据发送协程")
simple_sender.update_coroutine()

-- 处理控制指令
function handle_control_command(command)
    if command == "restart" then
        print("[INFO] 收到重启指令")
        -- 重启脚本逻辑
    elseif command == "stop" then
        print("[INFO] 收到停止指令")
        -- 停止脚本逻辑
    elseif command == "pause" then
        print("[INFO] 收到暂停指令")
        -- 暂停脚本逻辑
    else
        print("[DEBUG] 未知控制指令: " .. tostring(command))
    end
end

-- 从配置文件读取用户配置（优先从wildHang.json随机选择）
local targetMapName, targetPositionName = config_loader.get_target_map_and_position()

print("[DEBUG] 使用配置 - 目标地图: " .. targetMapName .. "，目标位置: " .. targetPositionName)

-- 设置全局变量供后续使用
targetMap = targetMapName
PosName = targetPositionName
devname   = sendPluginEvent(1,"devname")--获取用户填写的设备名
print("devname:"..tostring(devname))


--[[
主流程函数说明：
- run()         ：主循环，调度游戏各阶段流程。
- LogInGame()   ：登录流程，自动完成启动、账号选择、角色选择、进入游戏等。
- GoFight()     ：前往目标地图并寻找挂机点，准备战斗。
- Fight()       ：战斗流程，自动点击战斗相关按钮。
- Hang()        ：挂机流程，自动买药、补给、检测挂机状态。
- Revive()      ：复活流程（可根据实际需求补充实现）。
]]--

-- 登录流程，自动完成启动、账号选择、角色选择、进入游戏等
function LogInGame()
    print('[DEBUG] 进入 LogInGame 流程')
    
    -- 首先检查Kitsunebi是否在运行，如果没有运行则启动
    print('[DEBUG] 检查Kitsunebi是否在运行...')
    local kitsunebi_running = appIsRunning(KITSUNEBI_PACKAGE)
    if kitsunebi_running == false then
        print('[DEBUG] Kitsunebi未运行，调用OpenKitsunebi启动')
        OpenKitsunebi()
    else
        print('[DEBUG] Kitsunebi已在运行')
    end
    
    -- 然后检查并启动夜鸭app
    check_night_crows_installed()
    launch_night_crows()
    --sleep(50000)

      -- 检测kitsunebi是否在运行
      local kitsunebi_running = appIsRunning(KITSUNEBI_PACKAGE)
      if kitsunebi_running == false then
          print('[DEBUG] Kitsunebi未运行，调用OpenKitsunebi启动')
          OpenKitsunebi()
          sleep(2000)
      end
      
        -- 检测夜鸭插件app是否在运行
        local nightcrows_plugin_running = appIsRunning(NIGHT_CROWS_PLUGIN_PACKAGE)
        if nightcrows_plugin_running == false then
            print('[DEBUG] 夜鸭插件app未运行，调用launch_night_crows_plugin启动')
            launch_night_crows_plugin()
            sleep(3000)
        end

      -- 检测夜鸭游戏是否在运行
      local nightcrows_running = appIsRunning(NIGHT_CROWS_PACKAGE)
      if nightcrows_running == false then
          print('[DEBUG] 夜鸭游戏未运行，调用launch_night_crows启动')
          launch_night_crows()
          sleep(3000)
      end
      
    local isLoginComplete = false
    local login_start_time = os.time()
    local login_timeout_sec = 300 -- 2分钟
    while isLoginComplete == false do
        if os.time() - login_start_time > login_timeout_sec then
            print("[DEBUG] 登录超时，重启游戏并重新开始登录流程")
            close_night_crows()
            OpenKitsunebi() --重启kitsunebi
            sleep(2000)
            config.gameState = config.State.LOGIN
            return
        end      

        print('[DEBUG] 检查登录各环节...')
        check_isLogin()
        check_is_account_login()
        auto_click_google_account()
        check_isRoleSelect()
        close_activity_popup()
        check_isFastLogin()
        if detect_and_handle_error_popup() == true then
            print('[DEBUG] 检测到错误界面，重启kitsunebi')
            OpenKitsunebi() --重启kitsunebi
            config.gameState = config.State.LOGIN
            LogInGame()       
            return
        end
        check_is_UpdatePanel()
        check_is_WeiHuPanel()
        isLoginComplete = check_isEnterGame()
        sleep(100)
    end
    print('[DEBUG] 登录流程完成，切换到 GOFIGHT')    
    config.gameState = config.State.GOFIGHT
end

-- 前往目标地图并寻找挂机点，准备战斗
function GoFight(mapName,PosName)
    print('[DEBUG] 进入 GoFight 流程')
    print("目标地图:"..tostring(mapName).." 目标点位:"..tostring(PosName))    
    OpenCurrentMap()
    OpenWorldMap(mapName)
    sleep(2000)
    local isOpenTargetMap = OpenTargetMap(mapName)
    print("isOpenTargetMap:"..tostring(isOpenTargetMap))
    if isOpenTargetMap == true then
        print('[DEBUG] 已打开目标地图，查找挂机点')
        FindFightPosByName(PosName)
        print('[DEBUG] 切换到 FIGHTING 状态')
        config.gameState = config.State.FIGHTING
    else
        print('[DEBUG] 未能打开目标地图')
    end
    sleep(5000) --等待5秒钟在检测是否在读取画面
    local isLoading = CheckIsLoading()
    while isLoading == true do
        print('[DEBUG] 检测到加载中，等待加载完成')
        sleep(1000)
        isLoading = CheckIsLoading()
    end
    sleep(10000)
    UseRandomChuansong()  
    print('[DEBUG] GoFight 流程结束，回到主界面挂机')
end

-- 战斗流程，自动点击战斗相关按钮
function Fight()
    print('[DEBUG] 进入 Fight 流程')
    CheckAndClickExitMap()
    StartAutoFight()
    print('[DEBUG] 切换到 HANG 状态')
    config.gameState = config.State.HANG
end

-- 挂机流程，自动买药、补给、检测挂机状态
function Hang()
    print('[DEBUG] 进入 Hang 流程')
    --StartAutoFight()
    FuHao()  -- FuHao() 中已经包含了 CheckHPNumber()，不需要重复调用
    CheckAndClickNPC(config.NpcName.杂货, function()
        CheckAndClickOneKeyBuy()
        CheckAndClickOneKeyBuyConfirm()
    end)
    CheckAndClickExitMap()
    CheckAndClickFangDaJing()
    
    -- 在挂机状态下收集游戏信息
    print('[DEBUG] 挂机状态下收集游戏信息...')
    gameInfoCollector.collectAllInfo()
    
    print('[DEBUG] 挂机流程执行完毕')
end

-- 复活流程（可根据实际需求补充实现）
function Revive()
    print('[DEBUG] 进入 Revive 流程（请补充实现）')
end

-- 显示当前游戏信息
function ShowGameInfo()
    print('[DEBUG] 显示当前游戏信息')
    gameInfoCollector.printGameInfo()
end

-- 日程安排流程
function DailyTask()
    print('[DEBUG] 进入 DailyTask 流程')
    
    -- 检查日程安排是否启用
    if not config_loader.is_daily_task_enabled() then
        print('[DEBUG] 日程安排未启用，跳过')
        config.gameState = config.State.HANG
        return
    end
    
    -- 加载日程安排配置
    local daily_task_config = config_loader.get_daily_task_config()
    if not daily_task_config then
        print('[ERROR] 无法加载日程安排配置')
        config.gameState = config.State.HANG
        return
    end
    
    -- 调用日程安排模块
    local dailyTask = require('dailyTask')
    local success = dailyTask.RunDailyTask()
    
    if success then
        print('[DEBUG] 日程安排执行成功')
    else
        print('[ERROR] 日程安排执行失败')
    end
    
    -- 执行完毕后回到挂机状态
    config.gameState = config.State.HANG
end

-- 每日任务流程
function DailyMission()
    print('[DEBUG] 进入 DailyMission 流程')
    
    -- 检查每日任务是否启用
    if not config_loader.is_daily_mission_enabled() then
        print('[DEBUG] 每日任务未启用，跳过')
        config.gameState = config.State.HANG
        return
    end
    
    -- 加载每日任务配置
    local daily_mission_config = config_loader.get_daily_mission_config()
    if not daily_mission_config then
        print('[ERROR] 无法加载每日任务配置')
        config.gameState = config.State.HANG
        return
    end
    
    -- 调用每日任务模块（需要创建dailyMission.lua）
    local dailyMission = require('dailyMission')
    local success = dailyMission.RunDailyMission()
    
    if success then
        print('[DEBUG] 每日任务执行成功')
    else
        print('[ERROR] 每日任务执行失败')
    end
    
    -- 执行完毕后回到挂机状态
    config.gameState = config.State.HANG
end

function OpenKitsunebi()
    -- 首先检查并启动Kitsunebi
    print('[DEBUG] 登录Kitsunebi...')
    local ok, err = pcall(function()
        launch_kitsunebi()
    end)
    if not ok then
        print('[WARNING] Kitsunebi启动失败: ' .. tostring(err))
    else
        print('[DEBUG] Kitsunebi启动成功')
    end
end

-- 主循环，调度游戏各阶段流程，增加异常捕获和详细log
function run()
    print('[DEBUG] 启动主循环，执行模式: ' .. tostring(config.execution_mode))
    
    -- 根据执行模式设置初始状态
    if config.execution_mode == "wild" then
        print('[DEBUG] 野外挂机模式')
        if check_isEnterGame() then
            config.gameState = config.State.GOFIGHT
        else
            config.gameState = config.State.LOGIN
        end
    elseif config.execution_mode == "daily_task" then
        print('[DEBUG] 日程安排模式')
        config.gameState = config.State.DAILY_TASK
    elseif config.execution_mode == "daily_mission" then
        print('[DEBUG] 每日任务模式')
        config.gameState = config.State.DAILY_MISSION
    else
        print('[WARNING] 未知执行模式: ' .. tostring(config.execution_mode))
        config.gameState = config.State.LOGIN
    end
    
    OpenKitsunebi()
    local should_exit = false
    
    -- 时间戳更新相关变量
    local last_timestamp_update = os.time()
    local timestamp_update_interval = 300  -- 5分钟更新一次时间戳
    
    while not should_exit and config.is_script_running do
        -- 检查暂停状态
        while _G.is_execution_paused and config.is_script_running do
            print('[DEBUG] 脚本已暂停，等待恢复...')
            sleep(1000)
        end
        
        if not config.is_script_running then
            break
        end
        local ok, err = pcall(function()           
            print('[DEBUG] 当前游戏状态: ' .. tostring(config.gameState))
            
            -- 根据执行模式和游戏状态执行相应流程
            if config.execution_mode == "wild" then
                -- 野外挂机模式的状态机
                if config.gameState == config.State.LOGIN then
                    LogInGame()
                elseif config.gameState == config.State.GOFIGHT then
                    GoFight(targetMap, PosName)
                elseif config.gameState == config.State.FIGHTING then
                    Fight()
                elseif config.gameState == config.State.HANG then
                    Hang()
                elseif config.gameState == config.State.REVIVE then
                    Revive()
                end
            elseif config.execution_mode == "daily_task" then
                -- 日程安排模式
                if config.gameState == config.State.DAILY_TASK then
                    DailyTask()
                elseif config.gameState == config.State.LOGIN then
                    LogInGame()
                    -- 登录完成后切换到日程安排
                    if config.gameState ~= config.State.LOGIN then
                        config.gameState = config.State.DAILY_TASK
                    end
                end
            elseif config.execution_mode == "daily_mission" then
                -- 每日任务模式
                if config.gameState == config.State.DAILY_MISSION then
                    DailyMission()
                elseif config.gameState == config.State.LOGIN then
                    LogInGame()
                    -- 登录完成后切换到每日任务
                    if config.gameState ~= config.State.LOGIN then
                        config.gameState = config.State.DAILY_MISSION
                    end
                end
            end
            
            -- 通用状态处理
            if config.gameState == config.State.END then
                print('[DEBUG] 检测到 END 状态，主循环退出')
                should_exit = true
                return
            end

            if CheckIsHang() == true then --如果检测到在挂机中，说明脚本还在正常运行
                -- 脚本正常运行，无需额外操作
            end
            
            -- 定时更新时间戳，防止监控线程误判超时
            local current_time = os.time()
            if current_time - last_timestamp_update >= timestamp_update_interval then
                print('[DEBUG] 定时更新时间戳，防止超时检测')
                config_loader.update_runtime_timestamp()
                last_timestamp_update = current_time
            end
            
            -- 游戏信息更新已移至设备数据发送器中，每5分钟自动更新
            -- 避免重复调用，提高性能
            
            -- 更新设备数据发送协程
            simple_sender.update_coroutine()
            
            sleep(100)
        end)
        if not ok then
            print('[ERROR] 主循环异常: ' .. tostring(err))
            should_exit = true
        end
    end
    print('[DEBUG] 主循环已退出')
end
print("myMain.lua 文件已加载")

-- while true do
--     local hitText = Tools.recognize_number_in_range(504,330,533,346, "0-173", 1, 1, require('Config.TextRecognition1').文字识别库_角色信息, 75)
--     print("命中值:"..tostring(hitText))
--     sleep(100)w 
-- end
-- 直接启动脚本流程
while true do
    gameInfoCollector.Test()
    sleep(1000)
end
print("[INFO] 开始启动脚本流程...")
run()
sleep(1000)

-- 重启脚本执行
function _G.restart_script_execution()
    print("[INFO] 重启脚本执行...")
    
    -- 停止当前执行
    _G.stop_script_execution()
    
    -- 重置状态
    _G.is_execution_paused = false
    config.is_script_running = true
    
    -- 使用协程方式启动脚本
    _G.script_execution_thread = coroutine.create(function()
        print("[INFO] 开始脚本执行线程...")
        run()
    end)
    
    -- 启动协程
    local success, error_msg = coroutine.resume(_G.script_execution_thread)
    if not success then
        print("[ERROR] 脚本执行失败: " .. tostring(error_msg))
    end
end

-- 停止脚本执行
function _G.stop_script_execution()
    print("[INFO] 停止脚本执行...")
    
    config.is_script_running = false
    _G.is_execution_paused = false
    _G.script_execution_thread = nil
end

-- 暂停脚本执行
function _G.pause_script_execution()
    print("[INFO] 暂停脚本执行...")
    _G.is_execution_paused = true
end

-- 恢复脚本执行
function _G.resume_script_execution()
    print("[INFO] 恢复脚本执行...")
    _G.is_execution_paused = false
end


